package com.example.demo.utils;
import com.example.demo.exception.folder.FolderNoneException;
import com.jcraft.jsch.SftpException;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.util.Objects;

public class FolderUtils {

    private SFTPUtil sftpUtil = new SFTPUtil("root", "zgh/123456", "47.98.175.236", 22);
    private SshUtils sshUtils=new SshUtils("47.98.175.236","root","zgh/123456");


    public static final String basePath="/var/noteServer";
    public static final String file="我的文件夹";
    public static final String header="头像目录";
    public static final String trash="回收站";
    public static final String picture="图片";
    public static final String IP="http://47.98.175.236:8088";

    /**
     * 新建文件夹
     * @param base 拼接后真正的根路径
     * @param path 文件夹路径
     * @throws IOException 报错
     */
    public void createFolder(String base, String path) throws IOException, SftpException {
        sftpUtil.login();
        sftpUtil.create(base, path);
        sftpUtil.logout();
    }

    /**
     * 上传文件夹
     * @param basePath 根路径
     * @param files 文件夹
     * @throws Exception 异常
     */
    public void uploadFolder(String basePath,String dir, MultipartFile[] files) throws Exception {
        if (files == null || files.length == 0) {
            throw new FolderNoneException();
        }
        for(MultipartFile myFile : files){
            String parentAll=myFile.getOriginalFilename();//得到文件的完整路径
            assert parentAll != null;
            String[] folders =parentAll.split("/");
            int allLength=parentAll.length();//整个路径的 长度
            int fileLength=folders[folders.length-1].length();//文件的长度
            String parent=dir+"/"+parentAll.substring(0,allLength-fileLength-1);//取得文件的父级目录(需要加上用户给的父目录）

            sftpUtil.login();
            File toFile=multipartFileToFile(myFile);
            InputStream is=new FileInputStream(toFile);
            sftpUtil.upload(basePath,parent,folders[folders.length-1],is);
            sftpUtil.logout();
        }

    }

    /**
     *上传MultipartFile文件
     * @param basePath 根目录
     * @param parentDir 父级目录
     * @param filename 文件名
     * @param file 文件本身
     * @throws Exception 抛出异常
     */
    public void uploadFile(String basePath,String parentDir,String filename,MultipartFile file) throws Exception {
        sftpUtil.login();
        File toFile=multipartFileToFile(file);
        InputStream is=new FileInputStream(toFile);
        sftpUtil.upload(basePath,parentDir,filename,is);
        sftpUtil.logout();
    }

    /**
     * 上传File文件
     * @param basePath 根目录
     * @param parentDir 父级目录
     * @param filename 文件名
     * @param file 文件本身
     * @throws FileNotFoundException 文件没有找到异常
     * @throws SftpException sftp异常
     */
    public void uploadRealFile(String basePath,String parentDir,String filename,File file) throws SftpException, FileNotFoundException {
        sftpUtil.login();
        InputStream is=new FileInputStream(file);
        sftpUtil.upload(basePath,parentDir,filename,is);
        sftpUtil.logout();
    }
    /**
     * 确保目录存在，不存在则创建
     * @param filePath 文件夹路径
     */
    private static void makeDir(String filePath) {
        if (filePath.lastIndexOf('/') > 0) {
            String dirPath = filePath.substring(0, filePath.lastIndexOf('/'));
            File dir = new File(dirPath);
            if (!dir.exists()) {
                dir.mkdirs();
            }
        }
    }


    /**
     * 将multipartfile转为file类型
     *
     * @param file multipartifile文件
     * @throws Exception 异常
     */
    public static File multipartFileToFile(MultipartFile file) throws Exception {
            File toFile;
//        if (file.getSize() <= 0)
//            toFile = null;

            InputStream ins;
            ins = file.getInputStream();
            toFile = new File(Objects.requireNonNull(SFTPUtil.class.getClassLoader().getResource("")).getPath() + Objects.requireNonNull(file.getOriginalFilename()));
            File parent = toFile.getParentFile();
            if(!parent.exists()) {
                parent.mkdir();
            }
            toFile.createNewFile();
            inputStreamToFile(ins, toFile);
            ins.close();

        return toFile;
    }
    private static void inputStreamToFile(InputStream ins, File file) {
        try {
            OutputStream os = new FileOutputStream(file);
            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
            os.close();
            ins.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 将原目录的一个文件夹移到指定其他目录
     * @param oldPath 原路径
     * @param newPath 新路径
     * @throws SftpException sftp异常
     */
    public void moveFolder(String oldPath,String newPath) throws SftpException {

        String commond="";
        commond="mv "+oldPath+" "+newPath;
        sshUtils.execute(commond);
    }
    /**
     * 将原目录的一个文件移到指定其他目录,与移动文件夹不同，移动文件需要创建父目录
     * @param oldPath 原路径
     * @param newPath 新路径
     * @throws SftpException sftp异常
     */
    public void moveFile(String oldPath,String newPath) throws SftpException{
        //eg: mv 我的文件夹/笔记/笔记1.txt 我的回收站/ >>>> 我的回收站/笔记1.txt
        //将file默认路径下的该文件夹移到trash默认路径下
        String[] tmps=newPath.split("/");
        StringBuilder parentPath=new StringBuilder("");
        int size=tmps.length;
        //因为这里newPath已经是/开头了，所以i从1开始
        for(int i=1;i<size-1;i++){
            parentPath.append("/").append(tmps[i]);
        }
        String commond="";
        //若是移动文件，要先创建其父目录
        commond="mkdir -p "+parentPath;
        int i=sshUtils.execute(commond);
        commond="mv "+oldPath+" "+newPath;
        sshUtils.execute(commond);
    }

    public void pasterFolder(String oldPath, String newPath){

        sshUtils.execute("mkdir -p "+newPath);
       sshUtils.execute("cp -r "+oldPath+" "+newPath);
    }
    public void pasteFile(String oldPath,String newPath){
        sshUtils.execute("mkdir -p "+newPath );
        sshUtils.execute("cp "+oldPath+" "+newPath);
    }
    /**
     * 删除一个文件
     * @param path 文件完整路径
     */
    public void deleteFile(String path){
        sshUtils.execute("rm " + path);
    }

    /**
     * 删除一个文件夹
     * @param path 文件夹完整路径
     */
    public void deleteFolder(String path){
        sshUtils.execute("rm -r " + path);
    }
    public void downloadFile(String remotePath,String localPath) throws SftpException, FileNotFoundException {
        sftpUtil.login();
        String[] dirs=remotePath.split("/");
        String dir="";
        String filename=dirs[dirs.length-1];
        for (int i=0;i<dirs.length-1;i++){
            if(i==0){
                dir+=dirs[i];
            }else{
                dir+="/"+dirs[i];
            }

        }
        sftpUtil.download(dir,filename,localPath);
        sftpUtil.logout();
    }
}
